module Simplicity
  require 'iconv'

  # это надо рекьюрить а то при вызове из левого(без обсервабле) места будем ловить ошибки
  require 'observer'
  include Observable

  def system( cmd, ignore = true ) # warning!!! toggle to false after debug
    stage_strt_time = Time.now
    cmd = win_path cmd

    changed; notify_observers( {:type => :sys_call, :content => cmd} )

    result = Kernel.system cmd if ! $options[:dry_run]
    if $options[:verbose]
      puts "Stage time: " + (Time.now - stage_strt_time).to_s
      puts "Exit status: #{result.inspect}"
    end

    if ! result and ! ignore
      msg = "Cmd returned not zero status: #{result}"
      puts msg
      raise msg
    end
  end

  def get_latest( product_name )
  end
  def win_path(str)
    # ruby 1.8:
    while str.match(/([:\w]\/)/)
      str.sub!($1, $1.sub(/\//, '\\'))
    end
    # ruby 1.9:
    #~ str.gsub!(/(?<=[^ ])\//, "\\")

    ic = Iconv.new('cp1251', 'utf-8')
    ic.iconv(str)
  end

  def move( from, to )
    cmd = %Q{move /Y #{from}, #{to}}
    system cmd
  end

  def delete( str )
    cmd = %Q{del /S /Q /F "#{str}"}
    system cmd

    # дурацкий в Винде del :(
    if File.directory? str
      cmd = %Q{rd /S /Q "#{str}"}
      system cmd, true
    end
  end

  def execute( str )
    cmd = %Q{#{str}}
    system( cmd )
  end

  # copies files from 'from' to 'to', recursively(cmd: xcopy) if 'rec == true' otherwise uses 'cmd: copy'
  def copy( from, to, rec = false)
    rec_flag = ''

    rec_flag = '/I' if to.match(/[\/\\]$/) and ! File.file? from

    # todo: Надо разобраться с этим хаком, он тут вообще только из-за СурсСейва
    if File.exist? to
      system("attrib -R #{to}")
      #~ $stdin.readline
    end

    # todo: clean decision code
    if (to.length > 0) and (! File.exist? to) #
      (rec or to.match(/[\/\\]$/)) ? \
        mkpath(to) :\
        mkpath( File.dirname(to) )

      #to.match(/[\/\\]$/) ? \
      #  mkpath( to ) :\
      #  mkpath( File.dirname(to) )
    end

    (to.length > 0) ? \
      to_str = %Q{"#{to}"} :\
      to_str = ''

    rec ? \
      cmd = %Q{xcopy "#{from}" #{to_str} #{rec_flag} /Q /H /S /Y} :\
      cmd = %Q{copy /Y "#{from}" #{to_str}}
    system cmd
  end

  def puts( str )
    changed; notify_observers( {:type => :log, :content => str} )
  end
end
